package ru.space_game.entities;

import ru.space_game.core.Game;
import ru.space_game.resource.Sprite;

/**
 * An entity which represents one of our space invader aliens.
 * 
 * @author Kevin Glass
 * @author Brian Matzon
 */
public class AlienEntity extends Entity {

	/** The animation frames */
	private Sprite[] frames = new Sprite[4];

	/** The time since the last frame change took place */
	private long lastFrameChange;

	/**
	 * The frame duration in milliseconds, i.e. how long any given frame of
	 * animation lasts
	 */
	private long frameDuration = 250;

	/** The current frame of animation being displayed */
	private int frameNumber;

	private Weapon weapon;

	/**
	 * Create a new alien entity
	 * 
	 * @param game
	 *            The game in which this entity is being created
	 * @param x
	 *            The initial x location of this alien
	 * @param y
	 *            The initial y location of this alien
	 */
	public AlienEntity(Game game, int x, int y) {
		super(game.getSprite("alien.gif"), x, y);

		// setup the animating frames
		frames[0] = sprite;
		frames[1] = game.getSprite("alien2.gif");
		frames[2] = sprite;
		frames[3] = game.getSprite("alien3.gif");
		speed = -100;
		miniMapColor = 0xaa000000;
		weapon = new Weapon();
	}

	/**
	 * Request that this alien moved based on time elapsed
	 * 
	 * @param delta
	 *            The time that has elapsed since last move
	 */
	public void move(long delta) {
		// since the move tells us how much time has passed
		// by we can use it to drive the animation, however
		// its the not the prettiest solution
		lastFrameChange += delta;

		// if we need to change the frame, update the frame number
		// and flip over the sprite in use
		if (lastFrameChange > frameDuration) {
			// reset our frame change time counter
			lastFrameChange = 0;

			// update the frame
			frameNumber++;
			if (frameNumber >= frames.length) {
				frameNumber = 0;
			}

			sprite = frames[frameNumber];
		}

		double changeDirection = Math.random() * 10;
		if (changeDirection < 0.02)
			angel += 10;
		if (changeDirection > 9.98)
			angel += 90;
		if (changeDirection < 0.02)
			fire();

		// proceed with normal move
		super.move(delta);
	}

	/**
	 * Update the game logic related to aliens
	 */
	public void doLogic() {

	}

	/**
	 * Notification that this alien has collided with another entity
	 * 
	 * @param other
	 *            The other entity
	 */
	public void collidedWith(Entity other) {
		// collisions with aliens are handled elsewhere
	}

	public boolean canFire() {
		return weapon.canFire();
	}

	public void fire() {
		weapon.fire(this);
	}
}